package com.trace.demo.repository;

import com.trace.demo.entity.FarmingInfo;
import com.trace.demo.entity.User;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

/**
 * 种植信息存储库
 */
@Repository
public interface FarmingInfoRepository extends JpaRepository<FarmingInfo, Long> {

    /**
     * 根据用户ID查找种植信息
     * @param userId 用户ID
     * @return 种植信息列表
     */
    @Query("SELECT f FROM FarmingInfo f WHERE f.user.id = :userId")
    List<FarmingInfo> findByUserId(@Param("userId") Long userId);
    
    /**
     * 根据用户ID查找种植信息（分页）
     * @param userId 用户ID
     * @param pageable 分页参数
     * @return 分页种植信息列表
     */
    @Query("SELECT f FROM FarmingInfo f WHERE f.user.id = :userId")
    Page<FarmingInfo> findByUserId(@Param("userId") Long userId, Pageable pageable);

    /**
     * 根据批次ID查找种植信息
     * @param batchId 批次ID
     * @return 种植信息
     */
    Optional<FarmingInfo> findByBatchId(String batchId);

    /**
     * 根据用户ID统计种植信息数量
     * @param userId 用户ID
     * @return 数量
     */
    @Query("SELECT COUNT(f) FROM FarmingInfo f WHERE f.user.id = :userId")
    long countByUserId(@Param("userId") Long userId);
    
    /**
     * 根据名称或批次ID模糊查询（分页）
     * @param name 名称关键词
     * @param batchId 批次ID关键词
     * @param pageable 分页参数
     * @return 分页种植信息列表
     */
    @Query("SELECT f FROM FarmingInfo f WHERE f.name LIKE %:name% OR f.batchId LIKE %:batchId%")
    Page<FarmingInfo> findByNameContainingOrBatchIdContaining(@Param("name") String name, @Param("batchId") String batchId, Pageable pageable);
    
    /**
     * 根据创建时间查询最近的种植信息
     * @param createdAt 创建时间
     * @param pageable 分页参数
     * @return 分页种植信息列表
     */
    Page<FarmingInfo> findByCreatedAtAfter(LocalDateTime createdAt, Pageable pageable);
    
    /**
     * 查询最近创建的种植信息
     * @param pageable 限制数量
     * @return 种植信息列表
     */
    @Query("SELECT f FROM FarmingInfo f ORDER BY f.createdAt DESC")
    List<FarmingInfo> findRecentFarmingInfo(Pageable pageable);

    /**
     * 根据名称或批次ID模糊查询且种植日期在指定范围内（分页）
     * @param name 名称关键词
     * @param batchId 批次ID关键词
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param pageable 分页参数
     * @return 分页种植信息列表
     */
    @Query("SELECT f FROM FarmingInfo f WHERE (f.name LIKE %:name% OR f.batchId LIKE %:batchId%) AND f.plantingDate BETWEEN :startDate AND :endDate")
    Page<FarmingInfo> findByNameContainingOrBatchIdContainingAndPlantingDateBetween(
            @Param("name") String name, 
            @Param("batchId") String batchId, 
            @Param("startDate") LocalDateTime startDate, 
            @Param("endDate") LocalDateTime endDate, 
            Pageable pageable);

    /**
     * 根据种植日期范围查询（分页）
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param pageable 分页参数
     * @return 分页种植信息列表
     */
    @Query("SELECT f FROM FarmingInfo f WHERE f.plantingDate BETWEEN :startDate AND :endDate")
    Page<FarmingInfo> findByPlantingDateBetween(
            @Param("startDate") LocalDateTime startDate, 
            @Param("endDate") LocalDateTime endDate, 
            Pageable pageable);
}
